import axios from "axios";
import Vue from "vue";
import router from "@/router";

const http = axios.create({
    // baseURL 将自动加在 url`前面，除非 url 是一个绝对 URL。
    // 它可以通过设置一个 baseURL 便于为 axios 实例的方法传递相对 URL
    baseURL: process.env.VUE_APP_BASE_URL,
    // timeout设置一个请求超时时间，如果请求时间超过了timeout，请求将被中断，单位为毫秒（ms）
    timeout: 6000,
    // headers是被发送的自定义请求头，请求头内容需要根据后端要求去设置，这里我们使用本项目请求头。
    headers: {
        'X-Custom-Header': 'foobar',
        'Accept': 'application/json',
        'Content-Type': 'application/json'
    }
})

// 添加请求拦截器
http.interceptors.request.use(function (config) {

    const token = localStorage.getItem("Web-Token-stu")
    if (token) {
        config.headers["token"] = token// 请求头带上token
    }
    // get请求映射params参数
    if (config.method === 'get' && config.params) {
        let url = config.url + '?';
        for (const propName of Object.keys(config.params)) {
            const value = config.params[propName];
            var part = encodeURIComponent(propName) + "=";
            if (value !== null && typeof (value) !== "undefined") {
                if (typeof value === 'object') {
                    for (const key of Object.keys(value)) {
                        if (value[key] !== null && typeof (value[key]) !== 'undefined') {
                            let params = propName + '[' + key + ']';
                            let subPart = encodeURIComponent(params) + '=';
                            url += subPart + encodeURIComponent(value[key]) + '&';
                        }
                    }
                } else {
                    url += part + encodeURIComponent(value) + "&";
                }
            }
        }
        url = url.slice(0, -1);
        config.params = {};
        config.url = url;
    }
    // 在发送请求之前做些什么
    return config;
}, function (error) {
    // 对请求错误做些什么
    console.log("请求拦截器错误：", error)
    return Promise.reject(error);
});

// 添加响应拦截器
http.interceptors.response.use(function (response) {
    // 2xx 范围内的状态码都会触发该函数。
      //当前token失效跳转会登录界面
    if (response.data.code === 403) {
        Vue.prototype.$message.warning(response.data.msg)
        return router.push("/login")

    }
    return response.data;
}, function (error) {
    // 超出 2xx 范围的状态码都会触发该函数。
    // 对响应错误做点什么
    console.log("响应拦截器错误：", error)
    return Promise.reject(error);
});

/**
 * 对外暴露封装的axios
 * @param requestMode 请求方式
 * @param url 后端url
 * @param data 形参
 */
export default http
